Skip to content

S05-08 高级特性-JAR包

[TOC]

JAR 包

在 Java 开发中,JAR (Java ARchive) 包是一个非常核心的概念。简单来说,JAR 包就是一种将多个 Java 类文件相关元数据资源(如文本、图片等) 打包到一个文件中的压缩格式。

你可以把它理解为 Java 世界的 .zip 文件(事实上,它底层使用的正是 ZIP 压缩算法),但它比普通的压缩包多了一些特定的 Java 规范。

JAR 包的核心结构

JAR 包的核心结构:

一个标准的 JAR 包解压后,通常包含以下内容:

  • .class 文件: Java 源代码(.java)编译后生成的字节码文件。这些文件会严格按照 Java 包名(Package)的目录结构进行组织(例如 com/example/MyClass.class)。
  • 资源文件: 程序运行所需的配置文件(如 .properties, .xml, .yaml)、图片、音频等。
  • META-INF 目录: 这是 JAR 包中最特殊的目录,用于存储包的元数据信息。
    • MANIFEST.MF 清单文件。这是 META-INF 目录下最重要的文件。它包含了关于 JAR 包的键值对信息,例如版本号、创建者,以及最关键的入口类(Main-Class) 声明。

导入 JAR 包

在 Java 开发中,“导入 JAR 包”通常包含两个层面的意思:第一步是将 JAR 包添加到项目的“类路径(Classpath)”中,让编译器和运行环境能找到它;第二步是在 Java 代码中使用 import 关键字引入 JAR 包里面的具体类。

对于现代 Java 开发来说,手动下载和导入 JAR 包的方式已经很少见了,大家基本都在使用构建工具(Maven 或 Gradle) 来自动管理。

手动导入

如果你正在做一个简单的学习项目,没有使用 Maven 或 Gradle,你需要先将 JAR 包下载到本地电脑,然后手动告诉 IDE 在哪里找它。

IDEA@
  1. 创建目录: 建议在项目根目录下新建一个名为 lib 的文件夹。

  2. 放入 JAR 包: 将下载好的 .jar 文件复制到这个 lib 文件夹中。

  3. 配置库: 右键点击这个 JAR 包(或整个 lib 文件夹)。

    • 在弹出的菜单中选择 "Add as Library..."(添加为库)。

    • 在弹出的确认框中点击 "OK"。

      此时,JAR 包旁边会出现一个小箭头,表示 IDEA 已经将其加入到类路径中,可以正常使用了。

Eclipse
  1. 在项目中创建一个 lib 文件夹,将 JAR 包复制进去。

  2. 右键点击项目名称,选择 "Build Path" -> "Configure Build Path..."

  3. 在弹出的窗口中选择 "Libraries" 选项卡。

  4. 点击右侧的 "Add JARs..."(如果 JAR 包在项目内)或 "Add External JARs..."(如果 JAR 包在电脑的其他地方)。

  5. 选中你的 JAR 包,点击 "Apply and Close"。

自动导入(推荐)

这是目前企业级开发绝对的主流。你不需要手动下载 JAR 包,只需在配置文件中声明,工具会自动从中央仓库(如 Maven Central)下载并导入到项目中。

Maven

如果你的项目是 Maven 项目,打开根目录下的 pom.xml 文件,找到 <dependencies> 标签,将你需要的 JAR 包的坐标(依赖)粘贴进去。

例如,导入谷歌的 Guava 工具包:

xml
<dependencies>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>32.1.3-jre</version>
    </dependency>
</dependencies>

保存文件后,IDEA 或 Eclipse 等编译器会自动刷新并下载该 JAR 包到本地缓存中。

Gradle

如果你的项目使用 Gradle,打开 build.gradle 文件,在 dependencies 代码块中添加依赖。

同样以导入 Guava 为例:

groovy
dependencies {
    // 引入 Guava 依赖
    implementation 'com.google.guava:guava:32.1.3-jre'
}

保存后,点击 IDE 中的 Gradle 刷新按钮即可。

命令行工具

使用 JDK 自带的 jar 命令行工具:

JDK 提供了一个名为 jar 的命令行工具。常用的命令如下:

  • 创建 JAR 包: jar cvf myapp.jar *.class (c=create, v=verbose, f=file)
  • 查看 JAR 包内容: jar tf myapp.jar (t=table of contents)
  • 解压 JAR 包: jar xvf myapp.jar (x=extract)
  • 创建可执行 JAR 包(指定入口点): jar cfe myapp.jar com.example.Main *.class (e=entry point)

JAR 包的主要分类

JAR 包的主要分类:

根据用途,JAR 包通常可以分为两类:

依赖库/类库

这是最常见的 JAR 包类型。它是一组封装好的类和方法的集合,供其他程序调用。

  • 特点: 没有程序的运行入口(即 MANIFEST.MF 中没有指定 Main-Class)。

  • 例子: 常用的第三方开源库,如 Guava.jar, Gson.jar, 或者各种 JDBC 驱动包。

  • 用法: 运行程序时,通过类路径(Classpath)引入:

    bash
    java -cp ".;lib/Gson.jar" com.example.MyProgram

可执行程序

这种 JAR 包本身就是一个完整的应用程序,可以直接运行。

  • 特点:META-INF/MANIFEST.MF 文件中,必须包含 Main-Class: 完整的包名.类名 这一行,告诉 JVM 从哪个类的 main 方法开始执行。

  • 例子: 使用 Spring Boot 打包出来的 Web 应用通常就是一个可执行的 "Fat JAR"(包含所有依赖的胖 JAR 包)。

  • 用法: 直接使用 java -jar 命令运行:

    bash
    java -jar my-application.jar

为什么要使用 JAR 包

为什么要使用 JAR 包:

  • 压缩与减小体积: 因为采用了 ZIP 算法,打包后的体积比散落的 .class 文件小很多,便于网络传输。
  • 方便部署与分发: 将成百上千个类文件和资源文件打包成一个独立的 .jar 文件,交付给客户或部署到服务器上时极其方便。
  • 安全性: 可以对 JAR 包的内容进行数字签名(Digital Signature),确保代码来源的可靠性且未被篡改。
  • 版本控制: 通过在包名或 MANIFEST.MF 中标注版本号,可以很好地管理软件的更新迭代。